<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //函数在当前作用域任意位置声明都可以被调用
        fn();

        function fn() {
            alert(1);
        }

        //变量在声明之前，也可以获取只不过没有被赋值
        console.log(a);//undefined
        var a = 1;

        console.log("b=" +b);

        var b = 2;

        /* 
        执行上下文；
           1.js执行代码并不是正真一行行解析的，而是一段段的解析，分段就是通过函数分的
           2.js在执行某段代码的时候，先会做一些准备工作，比如在内存中开辟一块空间，确定this，
           确定作用域链接.确定变量对象，我们把这个准备工作叫做执行上下文
           3.js有三种代码类型，全局，局部，eval（不推荐使用）
           4.代码运行会先碰到全局代码，那么就会有一个全局执行上下文，频道函数调用，就会
           创建一个局部的执行上下文
           5.可能页面中会出现多个执行上下文，所以有一个执行上下文栈(存储结构) 专门
           用来存放执行上下文
           6.当js执行，先遇到全局，然后把全局上下文压入栈中，全局指上下文直到关闭才退出
           栈
           7.当js遇到局部执行上下文，就会把他压入执行上下文栈中，当函数执行完成以后就退出栈
        */
    </script>
</body>
</html>